Given an integer array nums
, find the subarray with the largest sum, and return its sum.
題目摘要
nums
,找出其中連續子陣列(至少包含一個元素)之和的最大值,並回傳該最大值。nums
,長度為 n
,其中 n ≥ 1
。Example 1:
Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: The subarray [4,-1,2,1] has the largest sum 6.
Example 2:
Input: nums = [1]
Output: 1
Explanation: The subarray [1] has the largest sum 1.
Example 3:
Input: nums = [5,4,-1,7,8]
Output: 23
Explanation: The subarray [5,4,-1,7,8] has the largest sum 23.
解題思路
定義最大和與當前和:
maxSum
和 currentSum
都初始化為陣列的第一個元素。這是因為至少有一個元素必須被包含在子陣列中,且陣列不為空。遍歷陣列:
從第二個元素開始(即 i = 1
),對每個元素,我們需要決定:
currentSum + nums[i]
),nums[i]
)。透過 currentSum = Math.max(nums[i], currentSum + nums[i])
來更新當前子陣列的和。更新最大和:
currentSum
後,檢查它是否比 maxSum
大。如果是,就更新 maxSum
。這樣,當我們遍歷完整個陣列後,maxSum
就會保存全局最大子陣列的和。程式碼
class Solution {
public int maxSubArray(int[] nums) {
//定義最大和為陣列的第一個元素
int maxSum = nums[0];
//定義當前子陣列和為陣列的第一個元素
int currentSum = nums[0];
//從陣列的第二個元素開始遍歷
for (int i = 1; i < nums.length; i++) {
//更新當前子陣列和:包括當前元素或者重新從當前元素開始
currentSum = Math.max(nums[i], currentSum + nums[i]);
//更新最大和
maxSum = Math.max(maxSum, currentSum);
}return maxSum; //回傳最大子陣列和
}
}
結論: 這題的最大子陣列問題,其實有點像我們在人生中面對挑戰時的抉擇。你可以選擇把每個困難(負數)繼續累積下去,或是乾脆從新的起點重新開始(拋棄負面情緒)。這就像是告訴你:「如果當下的狀況拖累了你,那就從現在開始重頭來過。」這個解法中,我們不斷在更新當前最佳狀態,並時時反思是否需要重新出發,這不正是我們處理問題的最佳策略嗎?這題不只教會我們如何在程式中找最大值,也像是提醒我們生活中面對挑戰時保持彈性和勇氣。